package com.longtop.framework.sys.flow.web;

import java.util.List;
import java.util.Map;

import com.longtop.framework.base.BaseAction;
import com.longtop.framework.common.Constant;
import com.longtop.framework.security.BaseCheckedException;
import com.longtop.framework.security.SessionObject;
import com.longtop.framework.sys.flow.model.TSysFlowNode;
import com.longtop.framework.sys.flow.model.TSysFlowParam;
import com.longtop.framework.sys.flow.model.TSysFlowRoute;
import com.longtop.framework.sys.flow.service.FlowNodeService;
import com.longtop.framework.util.BeanUtil;
import com.longtop.framework.util.WebUtil;
import com.longtop.intelliweb.action.IActionContext;
import com.longtop.intelliweb.action.IInitContext;
import com.longtop.intelliweb.view.Dataset;
import com.longtop.intelliweb.view.Panel;

/**
 * 
 * @author 杨向阳
 * 
 */

public class FlowNodeListAction extends BaseAction {

	private final static String DATASET_FLOW_NODE = "Dataset_FlowNode";
	private final static String DATASET_FLOW_ROUTE = "Dataset_FlowRoute";
	private final static String DATASET_FLOW_PARAM = "Dataset_FlowParam";
	private final static String DATASET_FLOW_TEAM = "Dataset_FlowTeam";

	/**
	 * JSP页面初始化方法
	 */
	public void init(IInitContext context) {
		super.init(context);
		String templateId = context.getRequest().getParameter("templateId"); // 模板id
		Panel panel1 = (Panel) context.getControl("Panel1");
		if (panel1 != null) {
			panel1.setTag(templateId); // 用panel的Tag属性传值
			panel1.setCaption(templateId + ": " + panel1.getCaption()); // 修改panel的标题
		}

		// 获取页面上的dataset的结构,验证数据集对象是否存在
		Dataset flowNodeDataset = context.getDataset(DATASET_FLOW_NODE);
		if (!WebUtil.validateDatasetExist(this, flowNodeDataset, DATASET_FLOW_NODE)) {
			return;
		}

		// 【1.读取该流程模板的 节点dataset】
		FlowNodeService flowNodeService = this.getBean(FlowNodeService.BEAN_ID); // 调用Spring的业务逻辑类
		List flowNodeList = flowNodeService.queryAll("from TSysFlowNode where templateId='" + templateId + "' order by sortNo"); // 节点list

		BeanUtil.listToDataset(flowNodeList, flowNodeDataset, false);

		// 【2.读取流程 用户组dataset】
		List flowTeamList = flowNodeService.queryAll("from TSysFlowTeam order by teamId"); // 节点list

		// 获取页面上的dataset的结构,验证数据集对象是否存在
		Dataset flowTeamDataset = context.getDataset(DATASET_FLOW_TEAM);
		if (!WebUtil.validateDatasetExist(this, flowTeamDataset, DATASET_FLOW_TEAM)) {
			return;
		}

		BeanUtil.listToDataset(flowTeamList, flowTeamDataset); // list 转 dataset
	}

	/**
	 * 保存节点 保存、修改、删除一起做！
	 * 
	 * @param context
	 */
	public void saveFlowNode(IActionContext context) {

		// 获取页面上的dataset的结构
		Dataset flowNodeDataset = context.getDataset(DATASET_FLOW_NODE);

		// 验证数据集是否存在及是否有变化
		if (!WebUtil.validateDatasetChange(this, flowNodeDataset, DATASET_FLOW_NODE)) {
			return;
		}

		// 调用Spring的业务逻辑类
		FlowNodeService flowNodeService = this.getBean(FlowNodeService.BEAN_ID);

		try {
			// 把dataset转成要删除的主键列表、新增bean及更新bean列表
			String templateId = "" + flowNodeDataset.getValue("templateId");
			Map changeMap = WebUtil.datasetToObjectList(flowNodeDataset, "nodeId", TSysFlowNode.class);

			// 获得SessionObject对象,得到用户对象
			SessionObject sessionObject = this.getSessionObject(context);

			// 调用业务逻辑层的批量更新方法(在一个事务内实现)
			Integer[] count = flowNodeService.saveFlowNode(changeMap, sessionObject);

			List list = flowNodeService.queryAll("from TSysFlowNode where templateId = '" + templateId + "'");
			BeanUtil.listToDataset(list, flowNodeDataset, false);// 返回DATASET给页面

			// 向JSP页面传递操作结果信息
			this.hintInfoMessage(WebUtil.getSubmitSuccessInfo(count[0].intValue(), count[1].intValue(), count[2].intValue()));
		} catch (BaseCheckedException e) {
			// 在界面显示错误信息
			this.hintErrorMessage(e.getMessage());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 保存路由 保存、修改、删除一起做！
	 * 
	 * @param context
	 */
	public void saveFlowRoute(IActionContext context) {

		// 获取页面上的dataset的结构
		Dataset flowRouteDataset = context.getDataset(DATASET_FLOW_ROUTE);

		// 验证数据集是否存在及是否有变化
		if (!WebUtil.validateDatasetChange(this, flowRouteDataset, DATASET_FLOW_ROUTE)) {
			return;
		}

		// 调用Spring的业务逻辑类
		FlowNodeService flowNodeService = this.getBean(FlowNodeService.BEAN_ID);

		try {
			// 把dataset转成要删除的主键列表、新增bean及更新bean列表
			String nodeId = "" + flowRouteDataset.getValue("nodeId");
			Map changeMap = WebUtil.datasetToObjectList(flowRouteDataset, "routeId", TSysFlowRoute.class);

			// 获得SessionObject对象,得到用户对象
			SessionObject sessionObject = this.getSessionObject(context);

			String idList = (String) changeMap.get(Constant.ID_LIST);
			// 删除相关路由属性
			if (idList != null && !"".equals(idList)) {
			}

			// 调用业务逻辑层的批量更新方法(在一个事务内实现)
			Integer[] count = flowNodeService.saveFlowRoute(changeMap, sessionObject);

			List list = flowNodeService.queryAll("from TSysFlowRoute where nodeId = '" + nodeId + "'");
			BeanUtil.listToDataset(list, flowRouteDataset, false);// 返回DATASET给页面

			// 向JSP页面传递操作结果信息
			this.hintInfoMessage(WebUtil.getSubmitSuccessInfo(count[0].intValue(), count[1].intValue(), count[2].intValue()));
		} catch (Exception e) {
			// 在界面显示错误信息
			this.hintErrorMessage(e.getMessage());
		}
	}

	/**
	 * 保存路由和参数对应关系 保存、修改、删除一起做！
	 * 
	 * @param context
	 */
	public void saveFlowParam(IActionContext context) {

		// 获取页面上的dataset的结构,验证数据集是否存在及是否有变化
		Dataset flowParamDataset = context.getDataset(DATASET_FLOW_PARAM);
		if (!WebUtil.validateDatasetChange(this, flowParamDataset, DATASET_FLOW_PARAM)) {
			return;
		}

		// 调用Spring的业务逻辑类
		FlowNodeService flowNodeService = this.getBean(FlowNodeService.BEAN_ID);

		try {
			// 把dataset转成要删除的主键列表、新增bean及更新bean列表
			Map changeMap = WebUtil.datasetToObjectList(flowParamDataset, "paramId", TSysFlowParam.class);

			// 获得SessionObject对象,得到用户对象
			SessionObject sessionObject = this.getSessionObject(context);

			// 调用业务逻辑层的批量更新方法(在一个事务内实现)
			Integer[] count = flowNodeService.saveFlowParam(changeMap, sessionObject);

			// 向JSP页面传递操作结果信息
			this.hintInfoMessage(WebUtil.getSubmitSuccessInfo(count[0].intValue(), count[1].intValue(), count[2].intValue()));
		} catch (Exception e) {
			// 在界面显示错误信息
			this.hintErrorMessage(e.getMessage());
		}
	}

	/**
	 * 根据页面提交的 当前节点==》获取该节点的所有路由
	 * 
	 * @param context
	 */
	public void loadFlowRoute(IActionContext context) throws Exception {
		String flowNodeId = context.getCommandParameterValue("flowNodeId"); // 取得当前节点id

		FlowNodeService flowNodeService = this.getBean(FlowNodeService.BEAN_ID); // 调用Spring的业务逻辑类
		List flowRouteList = flowNodeService.queryAll("from TSysFlowRoute where nodeId='" + flowNodeId + "'"); // 路由list

		// 获取页面上的dataset的结构,验证数据集对象是否存在
		Dataset flowRouteDataset = context.getDataset(DATASET_FLOW_ROUTE);
		if (!WebUtil.validateDatasetExist(this, flowRouteDataset, DATASET_FLOW_ROUTE)) {
			return;
		}
		flowRouteDataset.clear(); // 清楚原有数据

		BeanUtil.listToDataset(flowRouteList, flowRouteDataset); // list 转 dataset
	}

	/**
	 * 根据页面提交的 当前路由==》获取当前路由的所有参数
	 * 
	 * @param context
	 */
	public void loadFlowParam(IActionContext context) throws Exception {
		String flowRouteId = context.getCommandParameterValue("flowRouteId"); // 取得当前节点id
		FlowNodeService flowNodeService = this.getBean(FlowNodeService.BEAN_ID); // 调用Spring的业务逻辑类
		List flowParamList = flowNodeService.queryAll("from TSysFlowParam where routeId='" + flowRouteId + "'"); // 路由参数list

		// 获取页面上的dataset的结构,验证数据集对象是否存在

		Dataset flowParamDataset = context.getDataset(DATASET_FLOW_PARAM);
		if (!WebUtil.validateDatasetExist(this, flowParamDataset, DATASET_FLOW_PARAM)) {
			return;
		}
		flowParamDataset.clear(); // 清楚原有数据

		BeanUtil.listToDataset(flowParamList, flowParamDataset); // list 转 dataset
	}
}